package org.openea.eap.module.obpm.service.form.generator;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.jsoup.nodes.Element;
import org.openbpm.base.api.exception.BusinessException;
import org.openbpm.base.core.util.AppUtil;
import org.openbpm.base.core.util.StringUtil;
import org.openbpm.base.core.util.ThreadMapUtil;
import org.openbpm.bus.api.constant.BusTableRelType;
import org.openbpm.bus.api.model.IBusTableRel;
import org.openbpm.bus.api.model.IBusinessColumn;
import org.openea.eap.module.obpm.model.form.design.FormColumn;
import org.openea.eap.module.obpm.model.form.design.FormGroup;
import org.springframework.stereotype.Component;








@Component
public class IviewFormReadOnlyShowTextElementGenerator
  extends AbsFormElementGenerator
{
  public String getGeneratorName() { return "iviewGenerator"; }


  private void handleVModel(Element element, IBusinessColumn column) {
    element.attr("v-model", getModelPath(column));
    handleElementPlaceHolder(column, element);
  }



  protected String getColumnOnetext(IBusinessColumn column) {
    Element element = getElement("i-input");

    handleVModel(element, column);
    handlePermission(element, column);
    handleValidateRules(element, column);

    return element.toString().concat(getReadOnlyText(column));
  }











  private String getReadOnlyText(IBusinessColumn column) { return getReadOnlyText(column, null); }


  private String getReadOnlyText(IBusinessColumn column, JSONArray options) {
    Element element = getElement("span");
    element.attr("v-show", getPermissionPath(column) + "=='r'");
    element.attr("class", "readonly-text");

    JSONObject optionJson = new JSONObject();
    if (options != null) {
      for (int i = 0; i < options.size(); i++) {
        JSONObject jsonObject = options.getJSONObject(i);
        optionJson.put(jsonObject.getString("key"), jsonObject.getString("txt"));
      }
      element.text("{{ " + getModelPath(column) + " | abFormat(" + optionJson.toJSONString() + ") }}");
    } else {
      element.text("{{ " + getModelPath(column) + " }}");
    }
    return element.toString();
  }





  protected String getColumnDate(IBusinessColumn column) {
    Element element = getElement("ab-date");

    handleVModel(element, column);
    element.attr("v-bind:ab-permission", getPermissionPath(column));
    element.attr("desc", column.getTable().getComment() + "-" + column.getComment());
    element.attr("readonly-show-text", "true");


    String configStr = column.getCtrl().getConfig();
    if (StringUtil.isEmpty(configStr)) {
      throw new BusinessException(String.format("表【%s】日期字段  【%s】解析失败,配置信息不能为空", new Object[] { column.getTable().getKey(), column.getComment() }));
    }

    String format = JSON.parseObject(configStr).getString("format");

    element.attr("format", format);

    return element.toString();
  }


  protected String getColumnDic(IBusinessColumn column) {
    Element element = getElement("ab-dict");

    handleVModel(element, column);
    element.attr("v-bind:ab-permission", getPermissionPath(column));
    element.attr("desc", column.getTable().getComment() + "-" + column.getComment());
    element.attr("readonly-show-text", "true");


    JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
    if (!config.containsKey("key")) {
      throw new BusinessException(String.format("表【%s】数据字典  字段【%s】解析失败,alias 配置信息不能为空", new Object[] { column.getTable().getKey(), column.getComment() }));
    }

    element.attr("dict-key", config.getString("key"));

    return element.toString();
  }







  protected String getColumnIdentity(IBusinessColumn column) {
    Element element = getElement("ab-serial-no");
    handleVModel(element, column);
    element.attr("v-bind:ab-permission", getPermissionPath(column));
    handleValidateRules(element, column);

    JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
    if (!config.containsKey("alias")) {
      throw new BusinessException(String.format("表【%s】流水号  字段【%s】解析失败,alias 配置信息不能为空", new Object[] { column.getTable().getKey(), column.getComment() }));
    }
    element.attr("serial-no", config.getString("alias"));

    return element.toString().concat(getReadOnlyText(column));
  }



  protected String getColumnMultitext(IBusinessColumn column) {
    Element element = getElement("i-input").attr("type", "textarea");

    handleVModel(element, column);
    handlePermission(element, column);
    handleValidateRules(element, column);

    return element.toString().concat(getReadOnlyText(column));
  }










  protected String getColumnCheckBox(IBusinessColumn column) {
    JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
    if (!config.containsKey("options")) {
      throw new BusinessException(String.format("表【%s】CheckBox 字段  【%s】解析失败,options 配置信息不能为空", new Object[] { column.getTable().getKey(), column.getComment() }));
    }

    Element checkbox = getElement("ab-checkbox-group");
    handleVModel(checkbox, column);
    handlePermission(checkbox, column);
    handleValidateRules(checkbox, column);

    JSONArray options = config.getJSONArray("options");
    for (int i = 0; i < options.size(); i++) {
      JSONObject option = options.getJSONObject(i);

      Element checkboxEl = checkbox.appendElement("checkbox");
      checkboxEl.attr("label", option.getString("key"));
      checkboxEl.appendText(option.getString("txt"));
    }
    return checkbox.toString().concat(getReadOnlyText(column, options));
  }


  protected String getColumnRadio(IBusinessColumn column) {
    JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
    if (!config.containsKey("options")) {
      throw new BusinessException(String.format("表【%s】Radio 字段  【%s】解析失败,options 配置信息不能为空", new Object[] { column.getTable().getKey(), column.getComment() }));
    }

    Element radioGroup = getElement("radio-group");
    JSONArray options = config.getJSONArray("options");

    handleVModel(radioGroup, column);
    handlePermission(radioGroup, column);
    handleValidateRules(radioGroup, column);

    for (int i = 0; i < options.size(); i++) {
      JSONObject option = options.getJSONObject(i);

      Element label = radioGroup.appendElement("radio");
      label.attr("label", option.getString("key"));
      label.appendText(option.getString("txt"));
    }

    return radioGroup.toString().concat(getReadOnlyText(column, options));
  }



  protected String getColumnSelect(IBusinessColumn column, Boolean isMultiple) {
    JSONObject config = JSON.parseObject(column.getCtrl().getConfig());
    if (!config.containsKey("options")) {
      throw new BusinessException(String.format("表【%s】Select 字段  【%s】解析失败,options 配置信息不能为空", new Object[] { column.getTable().getKey(), column.getComment() }));
    }

    Element iSelectEl = getElement("i-select");
    handleVModel(iSelectEl, column);
    handlePermission(iSelectEl, column);
    handleValidateRules(iSelectEl, column);
    iSelectEl.attr(":disabled", "'r'==" + getPermissionPath(column));

    if (isMultiple.booleanValue()) {
      iSelectEl.attr("multiple", "true");
    }

    Element select = iSelectEl.appendElement("i-option");
    select.attr("value", "");
    select.text("请选择");

    JSONArray options = config.getJSONArray("options");
    for (int i = 0; i < options.size(); i++) {
      JSONObject option = options.getJSONObject(i);

      Element element = iSelectEl.appendElement("i-option");
      element.attr("value", option.getString("key"));
      element.text(option.getString("txt"));
    }

    return iSelectEl.toString().concat(getReadOnlyText(column, options));
  }


  protected String getColumnFile(IBusinessColumn column) {
    Element element = getElement("ab-upload");
    handleVModel(element, column);
    element.attr("v-bind:ab-permission", getPermissionPath(column));
    element.attr("desc", column.getTable().getComment() + "-" + column.getComment());

    return element.toString();
  }




  protected String getColumnCitySelect(IBusinessColumn column) {
    Element element = getElement("city");

    handleVModel(element, column);
    handlePermission(element, column);
    handleValidateRules(element, column);
    element.attr("show-suffix", "");
    element.attr(":disabled", getPermissionPath(column) + "=='r'");

    return element.toString();
  }










  public String getSubAttrs(IBusTableRel rel) {
    if (rel.getType().equals(BusTableRelType.MAIN.getKey())) return "";
    StringBuilder sb = new StringBuilder();
    sb.append(" table-key=\"" + rel.getTableKey() + "\" ");

    if (rel.getType().equals(BusTableRelType.ONE_TO_MANY.getKey()) && !rel.getParent().getType().equals(BusTableRelType.MAIN.getKey())) {
      sb.append(" v-model=\"subTempData." + rel.getBusObj().getKey() + "_" + rel.getTableKey() + "_Model\" ");
      sb.append(" @on-ok=\"subTempData." + rel.getBusObj().getKey() + "_" + rel.getTableKey() + "_okFn()\" ");
      sb.append(" @on-cancel=\"subTempData." + rel.getBusObj().getKey() + "_" + rel.getTableKey() + "_Model=false\" ");
    }
    return sb.toString();
  }

  public String getGroupTableName(FormGroup group) {
    if (CollectionUtil.isEmpty(group.getColumnList())) return "";
    String tableKey = null;

    for (FormColumn column : group.getColumnList()) {
      if (tableKey != null && !tableKey.equals(column.getTableKey())) {
        return "";
      }
      tableKey = column.getTableKey();
    }
    if (group.getTableRelation().getTableKey().equals(tableKey)) {
      return "";
    }

    return " table-key=\"" + tableKey + "\" ";
  }


  public Boolean isMultilayer(IBusTableRel rel) {
    if (rel.getType().equals(BusTableRelType.ONE_TO_MANY.getKey()) && !rel.getParent().getType().equals(BusTableRelType.MAIN.getKey())) {
      return Boolean.valueOf(true);
    }
    return Boolean.valueOf(false);
  }



  @Override
  protected void handlePermission(Element element, IBusinessColumn column) { element.attr("v-ab-permission:edit", getPermissionPath(column)); }



  protected void handleValidateRules(Element element, IBusinessColumn column) {
    super.handleValidateRules(element, column);
    element.attr("v-ab-validate", element.attr("ab-validate"));
    element.attr("desc", column.getTable().getComment() + "-" + column.getComment());
    element.removeAttr("ab-validate");
  }



  public String getScopePath(IBusTableRel relation) { return ((VueFormElementGenerator)AppUtil.getBean(VueFormElementGenerator.class)).getScopePath(relation); }



  public String getScopePath_old(IBusTableRel relation) { return super.getScopePath(relation); }









  protected String getPermissionPath(IBusinessColumn column) { return ((VueFormElementGenerator)AppUtil.getBean(VueFormElementGenerator.class)).getPermissionPath(column); }










  public String getLineColumn(IBusinessColumn column, IBusTableRel relation) {
    ThreadMapUtil.put("isLine", Boolean.valueOf(true));
    String str = getColumn(column, relation);
    ThreadMapUtil.remove("isLine");
    return str;
  }

  public String getLineColumn(FormGroup group, FormColumn formColumn) {
    IBusTableRel tableRel = group.getTableRelation();


    if (StringUtil.isNotEmpty(formColumn.getTableKey()) && !formColumn.getTableKey().equals(tableRel.getTableKey())) {
      IBusTableRel table = tableRel.find(formColumn.getTableKey());
      if (table != null) {
        tableRel = table;
      }
    }

    if (!formColumn.getTableKey().equals(tableRel.getTableKey())) {
      this.LOG.error("生成表单可能存在异常！formColumnTableKey{},tableRelTableKey{}", formColumn.getTableKey(), tableRel.getTableKey());
    }

    IBusinessColumn businessColumn = tableRel.getTable().getColumnByKey(formColumn.getKey());

    if (businessColumn == null) {
      this.LOG.error("布局模板查找Column配置失败！字段：{}，表：{}", formColumn.getComment(), formColumn.getTableKey());
    }

    return getLineColumn(businessColumn, tableRel);
  }
}
